package com.lytfly.flowable.modules.flow.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.lytfly.flowable.domain.ProcessStatusEnum;
import com.lytfly.flowable.modules.flow.entity.FlowExtendHisprocinst;
import com.lytfly.flowable.modules.flow.entity.FlowExtendProcinst;
import com.lytfly.flowable.modules.flow.mapper.FlowExtendProcinstMapper;
import com.lytfly.flowable.modules.flow.service.IFlowExtendHisprocinstService;
import com.lytfly.flowable.modules.flow.service.IFlowExtendProcinstService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author liuyuantao
 * @since 2021年07月15日 12时08分
 */
@Service
public class FlowExtendProcinstServiceImpl extends ServiceImpl<FlowExtendProcinstMapper, FlowExtendProcinst> implements IFlowExtendProcinstService {

    @Autowired
    private IFlowExtendHisprocinstService extendHisprocinstService;

    @Override
    public void saveExtendProcinstAndHis(FlowExtendProcinst extendProcinst) {
        extendProcinst.setId(IdWorker.get32UUID());
        this.save(extendProcinst);
        FlowExtendHisprocinst flowExtendHisprocinst = new FlowExtendHisprocinst();
        BeanUtils.copyProperties(extendProcinst, flowExtendHisprocinst);
        flowExtendHisprocinst.insert();
    }

    @Override
    public void deleteExtendProcinstByProcessInstanceId(String processInstanceId) {
        LambdaQueryWrapper<FlowExtendProcinst> extendProcinstLambdaQueryWrapper = new LambdaQueryWrapper<>();
        extendProcinstLambdaQueryWrapper.eq(FlowExtendProcinst::getProcessInstanceId, processInstanceId);
        this.remove(extendProcinstLambdaQueryWrapper);
    }

    /**
     * 通过流程实例获取运行时的扩展信息
     *
     * @param processInstanceId 流程实例id
     * @return
     */
    @Override
    public FlowExtendProcinst findExtendProcinstByProcessInstanceId(String processInstanceId) {
        LambdaQueryWrapper<FlowExtendProcinst> extendProcinstLambdaQueryWrapper = new LambdaQueryWrapper<>();
        extendProcinstLambdaQueryWrapper.eq(FlowExtendProcinst::getProcessInstanceId, processInstanceId);
        return this.getOne(extendProcinstLambdaQueryWrapper);
    }

    @Override
    public void updateStatus(ProcessStatusEnum processStatus, String processInstanceId) {
        LambdaUpdateWrapper<FlowExtendProcinst> extendProcinstLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        extendProcinstLambdaUpdateWrapper.set(FlowExtendProcinst::getProcessStatus, processStatus.getType())
                .eq(FlowExtendProcinst::getProcessInstanceId, processInstanceId);
        this.update(extendProcinstLambdaUpdateWrapper);
        LambdaUpdateWrapper<FlowExtendHisprocinst> extendHisprocinstLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        extendHisprocinstLambdaUpdateWrapper.set(FlowExtendHisprocinst::getProcessStatus, processStatus.getType())
                .eq(FlowExtendHisprocinst::getProcessInstanceId, processInstanceId);
        extendHisprocinstService.update(extendHisprocinstLambdaUpdateWrapper);
    }
}
